/*
 * @lc app=leetcode.cn id=2 lang=cpp
 * @lcpr version=30204
 *
 * [2] 两数相加
 */

// @lcpr-template-start
using namespace std;
#include <algorithm>
#include <array>
#include <bitset>
#include <climits>
#include <deque>
#include <functional>
#include <iostream>
#include <list>
#include <queue>
#include <stack>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
// @lcpr-template-end
// @lc code=start
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution
{
public:
    ListNode *addTwoNumbers(ListNode *l1, ListNode *l2)
    {
        //  模拟加法过程
        ListNode *res = nullptr;        // 可以使用头结点简化第一个结点的判断过程
        ListNode *cur = nullptr;
        int add = 0, carry = 0, num1 = 0, num2 = 0;     
        while (l1 || l2)
        {
            num1 = l1 ? l1->val : 0;
            num2 = l2 ? l2->val : 0;
            add = (num1 + num2 + carry) % 10;       // 当前位数
            carry = (num1 + num2 + carry) / 10;     // 进位情况
            if(!res)                                // 头结点为空，则当前指针和头指针开辟新的结点
                res = cur = new ListNode(add);
            else                                    // 不为空则当前指针链接新的结点，并指向下一个结点
            {
                cur->next = new ListNode(add);
                cur = cur->next;
            }

            if(l1)  l1 = l1->next;                  // 两个链表的指针迭代
            if(l2)  l2 = l2->next;
        }

        if (carry)                                  // 最后判断是否剩余进位
        {
            cur->next = new ListNode(carry);
        }

        return res;
    }
};
// @lc code=end

/*
// @lcpr case=start
// [2,4,3]\n[5,6,4]\n
// @lcpr case=end

// @lcpr case=start
// [0]\n[0]\n
// @lcpr case=end

// @lcpr case=start
// [9,9,9,9,9,9,9]\n[9,9,9,9]\n
// @lcpr case=end

 */
